#include <iostream>

// 栈类模板
template<typename T>
class Stack {
private:
    // 用于存储栈元素的数组
    T* elements;
    // 栈顶指针
    int top;
    // 栈的容量
    int capacity;

public:
    // 构造函数，初始化栈
    Stack(int size = 100) {
        capacity = size;
        elements = new T[capacity];
        top = -1;
    }

    // 析构函数，释放内存
    ~Stack() {
        delete[] elements;
    }

    // 入栈操作
    void push(const T& value) {
        if (top == capacity - 1) {
            std::cout << "栈已满，无法入栈！" << std::endl;
            return;
        }
        top++;
        elements[top] = value;
    }

    // 出栈操作
    T pop() {
        if (top == -1) {
            std::cout << "栈为空，无法出栈！" << std::endl;
            // 返回一个默认构造的T类型值，这里假设T有默认构造函数
            return T();
        }
        T value = elements[top];
        top--;
        return value;
    }

    // 判断栈是否为空
    bool isEmpty() const {
        return top == -1;
    }
};
int main() {
    // 创建一个存储整数的栈
    Stack<int> intStack;

    intStack.push(10);
    intStack.push(20);
    intStack.push(30);

    while (!intStack.isEmpty()) {
        std::cout << intStack.pop() << " ";
    }

    std::cout << std::endl;

    // 创建一个存储字符的栈
    Stack<char> charStack;

    charStack.push('a');
    charStack.push('b');
    charStack.push('c');

    while (!charStack.isEmpty()) {
        std::cout << charStack.pop() << " ";
    }

    std::cout << std::endl;

    return 0;
}